package cn.demoncat.test.neo.node;

import org.neo4j.ogm.annotation.EndNode;
import org.neo4j.ogm.annotation.RelationshipEntity;
import org.neo4j.ogm.annotation.StartNode;

/**
 * 关系实体
 *
 * 特点：A -【关系】-> B
 *
 * 间接关系：类型类型（对应关系实体）；关系有属性
 *
 * 保存关系：同时保存关联的节点（有属性；保存节点时同时保存直接关联的节点和关系）
 * 查询关系：同时返回关联的节点
 * 查询节点：防止JSON序列化时循环引用导致StackOverflowError，需要在序列化前置null关系实体或节点实体(根据查询主表而定)
 */
@RelationshipEntity("USER_FOOD")
public class RUserRelation {

    private Long id;
    private String name;
    // 节点A
    @StartNode
    private RUserNode user;
    // 节点B
    @EndNode
    private RFoodNode food;

    /**
     * JSON序列化前预处理
     *
     * 1、查询 RUserRelation
     * 2、RUserRelation.user 持有 RUserRelation 自身，这将导致JSON序列化时StackOverflowError
     * 3、预处理：置null关系实体(RUserRelation.user.RUserRelation)
     *
     * @param list 查询结果
     * @return 处理后
     */
    public static Iterable<RUserRelation> beforeJson(Iterable<RUserRelation> list){
        if (list != null) {
            list.forEach(o -> {
                if (o.getUser() != null && o.getUser().getFoods() != null) {
                    o.getUser().setFoods(null);
                }
            });
        }
        return list;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public RUserNode getUser() {
        return user;
    }

    public void setUser(RUserNode user) {
        this.user = user;
    }

    public RFoodNode getFood() {
        return food;
    }

    public void setFood(RFoodNode food) {
        this.food = food;
    }
}
